
from datetime import datetime
from typing import List



def is_duplicate(model, field_name, value):
    """
is_duplicate函数接受一个模型、字段名称和值。
然后，它在数据库中查询与给定字段名称和值匹配的任何记录。
如果它找到一个或多个匹配的记录，则返回True；否则为False。

：param model：指定要检查重复项的模型类
：param field_name：指定要检查重复项的字段
：param value：检查该值是否已在数据库中
：return：如果值已在数据库中，则为True

"""
    query = getattr(model, 'query')

    filter_kwargs = dict(zip(field_name, value))


    existing_record = query.filter_by(**filter_kwargs).first()

    return existing_record is not None


def obj_to_dict(obj, fields=None, exclude=None):
    """
obj_to_dict函数接受一个模型对象，并返回一个字典，其中包含模型中指定的字段。

：param obj：指定要转换为字典的模型类
：param fields：指定要转换的字段
：param exclude：指定要排除的字段
：return：返回一个字典，其中包含模型中指定的字段

"""
    opts = obj._sa_class_manager.mapper.mapped_table.columns
    if fields is None:
        fields = []
    if exclude:
        fields = [f for f in fields if f not in exclude]
    return {c.name: getattr(obj, c.name) for c in opts if c.name in fields}



def obj_to_dict(query, exclude: List[str] = None, transform_date_args: List[str] = None, fields: List[str] = None):
    """
    将 SQLAlchemy 模型对象转换为字典，可选排除字段、转换日期、转换指定字段

    :param obj: SQLAlchemy 模型对象
    :param exclude: 需要排除的字段列表
    :param transform_date_args: 需要转换为日期字符串的字段列表
    :param fields: 需要转换的字段列表
    :return: 字典对象，包含指定的字段
    """
    obj_list = []

    for obj in query:

        od = obj.__dict__
        if '_sa_instance_state' in od:
            od.pop('_sa_instance_state')
        if exclude:
            [od.pop(x) for x in exclude if x in od]
        if fields:
            od = {k: v for k, v in od.items() if k in fields}
        if transform_date_args:
            for x in transform_date_args:
                if x in od and od[x]:
                    od[x] = od[x].strftime('%Y-%m-%d %H:%M:%S')
        obj_list.append(od)
    return obj_list
